/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package javaapplication1;

import Interface.TelaPrincipal;

/**
 *
 * @author Diego
 */
public class Processador {
    private Processos procExecutando;
    private Memória memoria;
    private int tempoExecutando;

    Processador (){
        procExecutando = null;
        memoria = new Memória();
        tempoExecutando = 0;
    }

    Processador (Memória mem){
        procExecutando = null;
        memoria = mem;
        tempoExecutando = 0;
    }

    public Memória getMemoria() {
        return memoria;
    }

    public Processos getProcExecutando() {
        return procExecutando;
    }

    public int getTempoExecutando() {
        return tempoExecutando;
    }

    public boolean livre(){
        if (procExecutando==null){
            return(true);
        }
        return(false);
    }

    public Processos retira() throws Exception{
        Processos pr = procExecutando;
        memoria.libera(procExecutando);
        if (procExecutando!=null){
        TelaPrincipal.getInstancia().escreverHistorico("O " + procExecutando.getNome() + " saiu da CPU.\n");
        }
        procExecutando = null;
        tempoExecutando = 0;
        return(pr);
    }

    void recebe(Processos proc) throws Exception{
        procExecutando = proc;
        tempoExecutando = 0;
        memoria.armazena(procExecutando);
        TelaPrincipal.getInstancia().escreverHistorico("O " + procExecutando.getNome() + " entrou na CPU\n");
    }

    public void processa(){
        if (!livre()){
            procExecutando.decrementaProcessorTime();
            tempoExecutando++;
        }
    }

    public boolean acabou() throws Exception{
        if (procExecutando!=null){
            if (procExecutando.getProcessorTime()==0){
                memoria.libera(procExecutando);
                TelaPrincipal.getInstancia().escreverHistorico("O " + procExecutando.getNome() + " foi concluido.\n");
                procExecutando = null;
                return true;
            }
        }
        return false;
    }
}
